58 lines
2.3 KiB
Markdown
58 lines
2.3 KiB
Markdown
|
## CspParameters.ParentWindowHandle now expects HWND value
|
|||
|
|
|||
|
### Scope
|
|||
|
Minor
|
|||
|
|
|||
|
### Version Introduced
|
|||
|
4.7
|
|||
|
|
|||
|
### Source Analyzer Status
|
|||
|
Investigating
|
|||
|
|
|||
|
### Change Description
|
|||
|
The `CspParameters.ParentWindowHandle` value, introduced in .NET Framework 2.0, allows an application to register a parent window handle value such
|
|||
|
that any UI required to access the key (such as a PIN prompt or consent dialog) opens as a modal child to the specified window.
|
|||
|
|
|||
|
Starting with apps that target the .NET Framework 4.7, a Windows Forms application can set the CspParameters.ParentWindowHandle property with code like the following:
|
|||
|
|
|||
|
```C#
|
|||
|
cspParameters.ParentWindowHandle = form.Handle;
|
|||
|
```
|
|||
|
|
|||
|
In previous versions of the .NET Framework, the value was expected to be an IntPtr representing a location in memory where the
|
|||
|
[HWND](https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#HWND) value resided.
|
|||
|
Setting the property to form.Handle on Windows 7 and earlier versions had no effect, but on Windows 8 and later versions, it results in a <20>CryptographicException: The parameter is incorrect.<2E>
|
|||
|
|
|||
|
- [X] Quirked
|
|||
|
- [ ] Build-time break
|
|||
|
|
|||
|
### Recommended Action
|
|||
|
Applications targeting .NET 4.7 or higher wishing to register a parent window relationship are encouraged to use the simplified form:
|
|||
|
|
|||
|
```C#
|
|||
|
cspParameters.ParentWindowHandle = form.Handle;
|
|||
|
```
|
|||
|
|
|||
|
Users who had identified that the correct value to pass was the address of a memory location which held the value `form.Handle` can opt out of the
|
|||
|
behavior change by setting the AppContext switch `Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle` to `true`.
|
|||
|
|
|||
|
1. By programmatically setting compat switches on the AppContext, as explained [here](http://blogs.msdn.com/b/dotnet/archive/2015/04/29/net-announcements-at-build-2015.aspx#dotnet46)
|
|||
|
2. By adding the following line to the `<runtime>` section of the app.config file:
|
|||
|
|
|||
|
```xml
|
|||
|
<runtime>
|
|||
|
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
|
|||
|
</runtime>
|
|||
|
```
|
|||
|
|
|||
|
Conversely, users who wish to opt in to the new behavior on the .NET Framework 4.7 runtime when the application loads under older .NET Framework versions
|
|||
|
can set the AppContext switch to `false`.
|
|||
|
|
|||
|
### Affected APIs
|
|||
|
* `P:System.Security.Cryptography.CspParameters.ParentWindowHandle`
|
|||
|
|
|||
|
### Category
|
|||
|
Security
|
|||
|
|
|||
|
<!-- breaking change id: 178 -->
|