المصادقة
المصادقة هي عملية اكتشاف والتحقق من هوية الحساب الأساسي عن طريق فحص بيانات الاعتماد للمستخدم و التحقق منها مقابل هيئة مرجعية ما. المعلومات التي يتم الحصول عليه أثناء عملية المصادقة قابلة للاستخدام مباشرة بواسطة التعليمات البرمجية الخاصة بك. يمكنك أيضاً استخدام الأمان المستند إلى الدور .NET Framework لمصادقة المستخدم الحالي ولتحديد ما إذا كان يجب السماح لهذا الحساب الأساسي بالوصول للتعليمات البرمجية الخاصة بك. راجع التحميلات الزائدة للأسلوب WindowsPrincipal.IsInRole للحصول على أمثلة حول كيفية مصادقة الحساب الأساسي لأدوار مُعينة. على سبيل المثال، يمكنك استخدام التحميل الزائد WindowsPrincipal.IsInRole(String) لتحديد ما إذا كان المستخدم الحالي عضواً في مجموعة Administrators (المسؤولون).
يتم استخدام مجموعة متنوعة من آليات المصادقة اليوم، يمكن استخدام العديد منها في الأمان المستند إلى الدور في بيئة .NET Framework. كمثال لبعض الآليات الأكثر استخداماً، basic (أساسي)، أو digest ، أو Passport، أو نظام التشغيل (مثل NTLM أو Kerberos) ، أو آليات مُعرفّة من قبل التطبيق.
المثال
يتطلب المثال التالي أن يكون الحساب الأساسي حساب مسؤول. يعد المتغير nameهو null، و هو الذي يسمح لأي مستخدم مسؤول بأن يمرر الطلب.
ملاحظة |
---|
في Windows Vista، يحدد التحكم في حساب المستخدم (UAC) امتيازات المستخدم.إذا كنت عضواً في مجموعة Administrators (المسؤولون) المضمنة، يتم تعيين اثنين من رموز الوصول المميزة لبيئة وقت التشغيل: أحدهما الرمز المميز للوصول للمستخدم القياسي والآخر هو الرمز المميز للوصول للمسؤول.افتراضياً، تكون في دور المستخدم القياسي.لتنفيذ التعليمات البرمجية التي تتطلب أن تكون مسؤولاً، يجب عليك أولاً رفع الامتيازات من المستخدم قياسي إلى المسؤول.يمكنك القيام بذلك عند بدء تشغيل أحد تطبيقات بواسطة النقر بزر الماوس الأيمن فوق رمز التطبيق ثم الإشارة إلى أنك تريد التشغيل كمسؤول (run as an administrator). |
Imports System
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal
Class SecurityPrincipalDemo
Public Shared Sub Main()
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Dim principalPerm As New PrincipalPermission(Nothing, "Administrators")
principalPerm.Demand()
Console.WriteLine("Demand succeeded.")
End Sub 'Main
End Class 'SecurityPrincipalDemo
using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;
class SecurityPrincipalDemo
{
public static void Main()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
PrincipalPermission principalPerm = new PrincipalPermission(null, "Administrators");
principalPerm.Demand();
Console.WriteLine("Demand succeeded.");
}
}
using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
using namespace System::Security::Policy;
using namespace System::Security::Principal;
int main(array<System::String ^> ^args)
{
System::String^ null;
AppDomain::CurrentDomain->SetPrincipalPolicy(PrincipalPolicy::WindowsPrincipal);
PrincipalPermission^ principalPerm = gcnew PrincipalPermission(null, "Administrators" );
principalPerm->Demand();
Console::WriteLine("Demand succeeded");
return 0;
}
يوضح المثال التالي كيفية تحديد هوية الحساب الأساسي والأدوار المتوفرة للحساب الأساسي. ويمكن أن يكون تطبيق لهذا المثال هو التأكد من أن المستخدم الحالي في دور تسمح أنت به لاستخدام التطبيق الخاص بك.
Imports System
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal
Class SecurityPrincipalDemo
Public Shared Sub DemonstrateWindowsBuiltInRoleEnum()
Dim myDomain As AppDomain = Thread.GetDomain()
myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Dim myPrincipal As WindowsPrincipal = CType(Thread.CurrentPrincipal, WindowsPrincipal)
Console.WriteLine("{0} belongs to: ", myPrincipal.Identity.Name.ToString())
Dim wbirFields As Array = [Enum].GetValues(GetType(WindowsBuiltInRole))
Dim roleName As Object
For Each roleName In wbirFields
Try
' Cast the role name to a RID represented by the WindowsBuildInRole value.
Console.WriteLine("{0}? {1}.", roleName, myPrincipal.IsInRole(CType(roleName, WindowsBuiltInRole)))
Console.WriteLine("The RID for this role is: " + Fix(roleName).ToString())
Catch
Console.WriteLine("{0}: Could not obtain role for this RID.", roleName)
End Try
Next roleName
' Get the role using the string value of the role.
Console.WriteLine("{0}? {1}.", "Administrators", myPrincipal.IsInRole("BUILTIN\" + "Administrators"))
Console.WriteLine("{0}? {1}.", "Users", myPrincipal.IsInRole("BUILTIN\" + "Users"))
' Get the role using the WindowsBuiltInRole enumeration value.
Console.WriteLine("{0}? {1}.", WindowsBuiltInRole.Administrator, myPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
' Get the role using the WellKnownSidType.
Dim sid As New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing)
Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid {0}? {1}.", sid.Value, myPrincipal.IsInRole(sid))
End Sub 'DemonstrateWindowsBuiltInRoleEnum
Public Shared Sub Main()
DemonstrateWindowsBuiltInRoleEnum()
End Sub 'Main
End Class 'SecurityPrincipalDemo
using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;
class SecurityPrincipalDemo
{
public static void DemonstrateWindowsBuiltInRoleEnum()
{
AppDomain myDomain = Thread.GetDomain();
myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
Console.WriteLine("{0} belongs to: ", myPrincipal.Identity.Name.ToString());
Array wbirFields = Enum.GetValues(typeof(WindowsBuiltInRole));
foreach (object roleName in wbirFields)
{
try
{
// Cast the role name to a RID represented by the WindowsBuildInRole value.
Console.WriteLine("{0}? {1}.", roleName,
myPrincipal.IsInRole((WindowsBuiltInRole)roleName));
Console.WriteLine("The RID for this role is: " + ((int)roleName).ToString());
}
catch (Exception)
{
Console.WriteLine("{0}: Could not obtain role for this RID.",
roleName);
}
}
// Get the role using the string value of the role.
Console.WriteLine("{0}? {1}.", "Administrators",
myPrincipal.IsInRole("BUILTIN\\" + "Administrators"));
Console.WriteLine("{0}? {1}.", "Users",
myPrincipal.IsInRole("BUILTIN\\" + "Users"));
// Get the role using the WindowsBuiltInRole enumeration value.
Console.WriteLine("{0}? {1}.", WindowsBuiltInRole.Administrator,
myPrincipal.IsInRole(WindowsBuiltInRole.Administrator));
// Get the role using the WellKnownSidType.
SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid {0}? {1}.", sid.Value, myPrincipal.IsInRole(sid));
}
public static void Main()
{
DemonstrateWindowsBuiltInRoleEnum();
}
}
public:
static void DemonstrateWindowsBuiltInRoleEnum()
{
AppDomain^ myDomain = Thread::GetDomain();
myDomain->SetPrincipalPolicy( PrincipalPolicy::WindowsPrincipal );
WindowsPrincipal^ myPrincipal = dynamic_cast<WindowsPrincipal^>(Thread::CurrentPrincipal);
Console::WriteLine( "{0} belongs to: ", myPrincipal->Identity->Name );
Array^ wbirFields = Enum::GetValues( WindowsBuiltInRole::typeid );
for each ( Object^ roleName in wbirFields )
{
try
{
Console::WriteLine( "{0}? {1}.", roleName,
myPrincipal->IsInRole( *dynamic_cast<WindowsBuiltInRole^>(roleName) ) );
}
catch ( Exception^ )
{
Console::WriteLine( "{0}: Could not obtain role for this RID.",
roleName );
}
}
}